home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / GRAHAM / XAAES_S.ZIP / XAAES / RECTLIST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-06  |  3.5 KB  |  156 lines

  1. /*
  2.  * XaAES - XaAES Ain't the AES
  3.  *
  4.  * A multitasking AES replacement for MiNT
  5.  *
  6.  */
  7.  
  8. #include <VDI.H>
  9. #include <MINTBIND.H>
  10. #include <memory.h>
  11. #include "XA_DEFS.H"
  12. #include "XA_TYPES.H"
  13. #include "XA_GLOBL.H"
  14. #include "K_DEFS.H"
  15. #include "C_WINDOW.H"
  16. #include "EVENTS.H"
  17. #include "rectlist.h"
  18.  
  19. #if JOHAN_RECTANGLES
  20. #include "j_rect.c"
  21. #else
  22.  
  23. #define max(x,y)    (((x)>(y))?(x):(y))
  24. #define min(x,y)    (((x)<(y))?(x):(y))
  25. /*
  26.  *    Compute intersection of two rectangles; put result rectangle
  27.  *    into *d; return TRUE if intersection is nonzero.
  28.  *
  29.  *    (Original version of this function taken from Digital Research's
  30.  *    GEM sample application `DEMO' [aka `DOODLE'],  Version 1.1,
  31.  *    March 22, 1985)
  32.  */
  33. short rc_intersect(const GRECT *s, GRECT *d)
  34. {
  35.     short x1,y1,x2,y2 ;
  36.  
  37.     x1 = max( s->g_x, d->g_x ) ;
  38.     y1 = max( s->g_y, d->g_y ) ;
  39.     x2 = min( s->g_x+s->g_w, d->g_x+d->g_w ) ;
  40.     y2 = min( s->g_y+s->g_h, d->g_y+d->g_h ) ;
  41.     d->g_x = x1 ;
  42.     d->g_y = y1 ;
  43.     d->g_w = x2 - x1 ;
  44.     d->g_h = y2 - y1 ;
  45.     return (x2 > x1) && (y2 > y1) ;
  46. }
  47.  
  48. /*
  49.     Rectangle List Generator 
  50.     - generates a list of clipping rectangles for a given window.
  51.     (Not a routine I'm proud of I'm afraid, but it seems to work ok)
  52. */
  53.  
  54. XA_RECT_LIST *generate_rect_list(XA_WINDOW *w)
  55. {
  56.     XA_WINDOW *wl;
  57.     XA_RECT_LIST *rl,*rlist,*nrl,*cnrl;
  58.     GRECT r_ours,r_win;
  59.     
  60.     rlist=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  61.     rlist->x=w->x;
  62.     rlist->y=w->y;
  63.     rlist->w=w->w;
  64.     rlist->h=w->h;
  65.     rlist->next=NULL;
  66.     
  67.     Psemaphore(2,WIN_LIST_SEMAPHORE,-1L);
  68.     
  69.     wl=w->prev;
  70.     while(wl)
  71.     {
  72.         if (wl->is_open)
  73.         {
  74.             nrl=NULL;
  75.             for(rl=rlist; rl; rl=rl->next)
  76.             {
  77.                 r_win.g_x=wl->x;
  78.                 r_win.g_y=wl->y;
  79.                 r_win.g_w=wl->w;
  80.                 r_win.g_h=wl->h;
  81.     
  82.                 r_ours.g_x=rl->x;
  83.                 r_ours.g_y=rl->y;
  84.                 r_ours.g_w=rl->w;
  85.                 r_ours.g_h=rl->h;
  86.                 if(rc_intersect(&r_ours, &r_win))
  87.                 {
  88.                     if((r_ours.g_w!=r_win.g_w)||(r_ours.g_h!=r_win.g_h))
  89.                     {
  90.                         if(r_win.g_x!=r_ours.g_x)
  91.                         {
  92.                             cnrl=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  93.                             cnrl->x=r_ours.g_x;
  94.                             cnrl->y=r_ours.g_y;
  95.                             cnrl->w=r_win.g_x-r_ours.g_x;
  96.                             cnrl->h=r_ours.g_h;
  97.                             cnrl->next=nrl;
  98.                             nrl=cnrl;
  99.                         }
  100.                         if(r_win.g_x+r_win.g_w!=r_ours.g_x+r_ours.g_w)
  101.                         {
  102.                             cnrl=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  103.                             cnrl->x=r_win.g_x+r_win.g_w;
  104.                             cnrl->y=r_ours.g_y;
  105.                             cnrl->w=r_ours.g_x+r_ours.g_w-r_win.g_x-r_win.g_w;
  106.                             cnrl->h=r_ours.g_h;
  107.                             cnrl->next=nrl;
  108.                             nrl=cnrl;
  109.                         }
  110.                         if(r_win.g_y!=r_ours.g_y)
  111.                         {
  112.                             cnrl=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  113.                             cnrl->x=r_win.g_x;
  114.                             cnrl->y=r_ours.g_y;
  115.                             cnrl->w=r_win.g_w;
  116.                             cnrl->h=r_win.g_y-r_ours.g_y;
  117.                             cnrl->next=nrl;
  118.                             nrl=cnrl;
  119.                         }
  120.                         if(r_win.g_y+r_win.g_h!=r_ours.g_y+r_ours.g_h)
  121.                         {
  122.                             cnrl=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  123.                             cnrl->x=r_win.g_x;
  124.                             cnrl->y=r_win.g_y+r_win.g_h;
  125.                             cnrl->w=r_win.g_w;
  126.                             cnrl->h=r_ours.g_y+r_ours.g_h-r_win.g_y-r_win.g_h;
  127.                             cnrl->next=nrl;
  128.                             nrl=cnrl;
  129.                         }
  130.                     }
  131.                 }else{    /* Keep the current rectangle, it hasn't been changed */
  132.                     cnrl=(XA_RECT_LIST*)malloc(sizeof(XA_RECT_LIST));
  133.                     cnrl->x=rl->x;
  134.                     cnrl->y=rl->y;
  135.                     cnrl->w=rl->w;
  136.                     cnrl->h=rl->h;
  137.                     cnrl->next=nrl;
  138.                     nrl=cnrl;
  139.                 }
  140.             }
  141.             for(cnrl=rlist; cnrl;)
  142.             {
  143.                 cnrl=cnrl->next;
  144.                 free(cnrl);
  145.             }
  146.             rlist=nrl;
  147.         }
  148.         wl=wl->prev;
  149.     }
  150.     
  151.     Psemaphore(3,WIN_LIST_SEMAPHORE,0L);
  152.     
  153.     return rlist;
  154. }
  155. #endif
  156.